<?php
///////////////////////////////////////////////////////////////////////////////////////////////////////
//  这个文件是 JCAT PHP框架的一部，该项目和此文件 均遵循 GNU 自由软件协议
// 
//  Copyleft 2008 JeCat.cn(http://team.JeCat.cn)
//
//
//  JCAT PHP框架 的正式全名是：Jellicle Cat PHP Framework。
//  “Jellicle Cat”出自 Andrew Lloyd Webber的音乐剧《猫》（《Prologue:Jellicle Songs for Jellicle Cats》）。
//  JCAT 是一个开源项目，它像音乐剧中的猫一样自由，你可以毫无顾忌地使用JCAT PHP框架。
//  JCAT 由中国团队开发维护，是一个国际性的项目。
//  正在使用的这个版本是：0.3.1 / SVN信息：$Id: class.JCAT_DBDocument.php 1119 2008-10-25 03:55:26Z alee $
//
//
//
//  相关的链接：
//    [主页] http://jcat.JeCat.cn
//    [HTTP下载] http://jcat.JeCat.cn/download
//    [在线文档] http://jcat.JeCat.cn/document
//    [社区] http://jj.jecat.cn/forum-7-1.html
//  不很相关：
//    [MP3] http://www.google.cn/search?q=jellicle+songs+for+jellicle+cats+Andrew+Lloyd+Webber
//    [VCD/DVD] http://www.google.cn/search?q=CAT+Andrew+Lloyd+Webber+video
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
/*-- Project Introduce --*/



JCAT_Package::ImportInterface('JCAT_IDBDocument',JCAT::PACKAGE_DOC) ;


/**
 * What's this Class ?
 *
 * @author		alee
 * @access		public
 */
class JCAT_DBDocument extends JCAT_Document implements JCAT_IDBDocument
{


	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @param	$sName										string									文档名称
	 * @param	$PrimaryTable								string,JCAT_DBTable						主数据表
	 * @param	$PrimaryKey=nul							JCAT_DBGenericTypes::$Column			主键
	 * @param	$ColumnList=self::TOTAL_COLUMNS			array, 	self::TOTAL_COLUMNS			返回字段
	 * @param	$aDB=null									JCAT_DB								What's this Parameter ?
	 * @return	void
	 */
	public function JCAT_DBDocument( $sName, $PrimaryTable, $PrimaryKey=null, $ColumnList=self::TOTAL_COLUMNS, JCAT_DB $aDB=null )
	{
		JCAT_ASSERT::ASSERT_STRING($sName) ;
		JCAT_ASSERT::ASSERT_ISTHESE($PrimaryTable,array('string','JCAT_DBTable')) ;

		$this->JCAT_Document($sName,JCAT_Document::STRUCT_STATIC) ;
		
		$this->sName = $sName ;

		// 使用缺省的 DB 对象
		if($aDB===null)
		{
			$this->aDB = JCAT_DB::CreateDefaultInstance() ;
		}
		
		// 使用传入的 DB 对象
		else
		{
			$this->aDB = $aDB ;
		}
		
		$aFactory = $this->aDB->GetFactory() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aFactory,'JCAT_DBAbstractFactory') ;
		
		// 设置数据表
		if( is_string($PrimaryTable) )
		{
			$aPrimaryTable = $aFactory->CreateTable($PrimaryTable) ;
			$this->sPrimaryTableName = $PrimaryTable ;
		}
		else if( JCAT_Global::IsKindOf($PrimaryTable,'JCAT_DBTable') )
		{
			$aPrimaryTable = $PrimaryTable ;
			$this->sPrimaryTableName = $PrimaryTable->GetName() ;
		}
		else
		{
			JCAT_ASSERT::ASSERT_(0,'!?') ;
		}

		$this->aDBTableJoin = $aFactory->CreateTableJoin($aPrimaryTable) ;
		
		// 设置主键
		if($PrimaryKey!==null)
		{
			$this->aPrimaryKey = JCAT_DBGenericTypes::TransColumn($aFactory,$PrimaryKey) ;
		}
		
		// 整理返回字段
		if($ColumnList===self::TOTAL_COLUMNS)
		{
			$aConnect = $this->aDB->GetConnect() ;
			$arrColumnList = $aConnect->GetColumnNameList($aPrimaryTable->GetName()) ;
		}
		else 
		{
			$arrColumnList =& $ColumnList ;
		}
		
		// 返回字段子句
		$this->aDBSubSQLReturnColumnList = JCAT_DBGenericTypes::TransReturnColumnList($aFactory,$arrColumnList,true) ;
		
		// Where 子句
		$this->aDBSubSQLWhere = $aFactory->CreateSubSQLWhere() ;

		// 构建静态文档结构
		
		foreach ($arrColumnList as $sColumnName)
		{			
			$this->SetStructure($this->GetStdColumnName($sColumnName),null) ;
		}
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function __sleep()
	{
		$arrSavePropertys = parent::__sleep() ;
		$arrSavePropertys[] = JCAT_Package::MakePrivatePropertyNameForSerialize('sPrimaryTableName',__CLASS__) ;
		$arrSavePropertys[] = JCAT_Package::MakePrivatePropertyNameForSerialize('aPrimaryKey',__CLASS__) ;
		
		return $arrSavePropertys ;
	}

	
	/**
	 * 将字段名同一为 table.column 格式
	 * 
	 * @access	public
	 * @param	$sColumnName			what's this
	 * @return	string
	 */
	public function GetStdColumnName($sColumnName)
	{
		JCAT_ASSERT::ASSERT_STRING($sColumnName) ;
		
		if( strstr($sColumnName,'.')===false )
		{
			return $this->GetPrimaryTableName().'.'.$sColumnName ;
		}
		else
		{
			return $sColumnName ;
		}
	}


	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @param	$sDataName			string	What's this Parameter ?
	 * @param	$Value				mixed	What's this Parameter ?
	 * @param	$bSetChanged=true	bool	What's this Parameter ?
	 * @return	old_var
	 */
	public function Set( $sDataName, $Value, $bSetChanged=true )
	{
		JCAT_ASSERT::ASSERT_STRING($sDataName) ;
		return JCAT_Document::Set($this->IsDataExists($sDataName)? $sDataName: $this->GetStdColumnName($sDataName),$Value,$bSetChanged) ;
	}


	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @param	$sDataName	string	What's this Parameter ?
	 * @return	mixed, null
	 */
	public function Get( $sDataName )
	{
		JCAT_ASSERT::ASSERT_STRING($sDataName) ;
		return JCAT_Document::Get( $this->IsDataExists($sDataName)? $sDataName: $this->GetStdColumnName($sDataName) ) ; 
	}


	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @return	JCAT_DB
	 */
	public function GetDB() 
	{
		return $this->aDB ;
	}

	/**
	 * 取得 SQL 数据表子句
	 * 
	 * @access	public
	 * @return	JCAT_DBTableJoin
	 */
	public function GetTableJoin() 
	{
		return $this->aDBTableJoin ;
	}
	

	/**
	 * 添加一个连接表
	 *
	 * @access	public
	 * @param	$Table				string,JCAT_DBTable				What's this Parameter ?
	 * @param	$ForeignKeyA=null	JCAT_DBGenericTypes::$Column	外键A
	 * @param	$ForeignKeyB=null	JCAT_DBGenericTypes::$Column	外键B
	 * @return	void
	 */
	public function AddJoinTable($Table,$ForeignKeyA=null,$ForeignKeyB=null)
	{
		JCAT_ASSERT::ASSERT_ISTHESE($PrimaryTable,array('string','JCAT_DBTable')) ;
		
		$aTableJoin = $this->GetTableJoin() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aTableJoin,'JCAT_DBTableJoin') ;
		
		$aTableJoin->AddTable($Table,false) ;
		
		// 添加外键
		if( $ForeignKeyA and $ForeignKeyB )
		{
			$aTableJoin->AddForeignKey($ForeignKeyA,$ForeignKeyB) ;
		}
	}
	
	/**
	 * 设置用于将两个表关联起来的外键字段
	 * 
	 * @access	public
	 * @param	$KeyA			JCAT_DBGenericTypes::$Column	外键A
	 * @param	$KeyB			JCAT_DBGenericTypes::$Column	外键B
	 * @param	$sOperator='='	string							运算符
	 * @param	$KeyC=null		JCAT_DBGenericTypes::$Column	外键C(用于三目运算)
	 * @return	void
	 */
	public function AddForeignKey( $KeyA, $KeyB, $sOperator='=', $KeyC=null ) 
	{
		$aTableJoin = $this->GetTableJoin() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aTableJoin,'JCAT_DBTableJoin') ;
		
		$aTableJoin->AddForeignKey($KeyA,$KeyB,$sOperator,$KeyC) ;
	}
	

	/**
	 * 取得 SQL 返回字段子句 对象
	 * 
	 * @access	public
	 * @return	JCAT_DBSubSQLReturnColumnList
	 */
	public function GetSubSQLReturnColumnList() 
	{
		return $this->aDBSubSQLReturnColumnList ;
	}

	/**
	 * 取得 SQL 返回字段子句 对象
	 * 
	 * @access	public
	 * @return	JCAT_DBSubSQLWhere
	 */
	public function GetSubSQLWhere() 
	{
		return $this->aDBSubSQLWhere ;
	}


	/**
	 * 返回主数据表
	 *
	 * @access	public
	 * @return	JCAT_DBTable
	 */
	public function GetPrimaryTable()
	{
		$aFactory = $this->GetDB()->GetFactory() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aFactory,'JCAT_DBAbstractFactory') ;
		
		return $aFactory->CreateTable(sPrimaryTableName) ;
	}
	
	/**
	 * 返回主数据表名称
	 *
	 * @access	public
	 * @return	string
	 */
	public function GetPrimaryTableName()
	{
		return $this->sPrimaryTableName ;
	}
	

	/**
	 * 设置主键值
	 *
	 * @access	public
	 * @param	$sValue	string		What's this Parameter ?
	 * @return	void
	 */
	public function SetPrimaryKeyValue( $sValue )
	{
		JCAT_ASSERT::ASSERT_( ($this->GetPrimaryKeyName()!==null)
				, JCAT_Language::SentenceEx('文档(%s)没有指定主键，无法设置主键值。','JCAT',null,$this->GetName()));
		
		$sPrimaryKeyValue = $this->GetPrimaryKeyValue() ;
		JCAT_ASSERT::ASSERT_NULL($sPrimaryKeyValue,JCAT_Language::SentenceEx('无法重复设定数据库文档的 主键值。','JCAT',null));
		
		$this->Set($this->GetPrimaryKeyName(),$sValue) ;

		// 主键
		$aPrimaryColumn = $this->GetPrimaryKey() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aPrimaryColumn,'JCAT_DBColumn',JCAT_Language::SentenceEx('数据库文档的 尚未设置主键。','JCAT',null)) ;
		
		// Where 子句
		$aSubSQLWhere = $this->GetSubSQLWhere() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aSubSQLWhere,'JCAT_DBSubSQLWhere') ;
		
		// 定位条件组
		$theTopConditionGroup = $aSubSQLWhere->GetTopGroup() ;
		$aOldGroup = $aSubSQLWhere->SetActiveGroup($theTopConditionGroup) ;
		
		// 添加条件
		$aSubSQLWhere->AddCondition($aPrimaryColumn, $sValue, '=')  ;
		
		// 恢复 当前条件组
		$aSubSQLWhere->SetActiveGroup($aOldGroup) ;		
	}
	
	/**
	 * 返回主键值
	 *
	 * @access	public
	 * @return	string, null
	 */
	public function GetPrimaryKeyValue()
	{
		$sPrimaryKeyName = $this->GetPrimaryKeyName() ;
		return ($sPrimaryKeyName!==null)? $this->Get( $sPrimaryKeyName ): null ;
	}

	/**
	 * 返回主键的字段名
	 * 
	 * @access	public
	 * @param	$bOnlyColumnName=false	bool
	 * @return	string, null
	 */
	public function GetPrimaryKeyName($bOnlyColumnName=true)
	{
		if($this->aPrimaryKey===null)
		{
			return null ;
		}
		else 
		{
			if($bOnlyColumnName)
			{	
				return $this->aPrimaryKey->GetName() ;
			}
			else
			{
				return $this->aPrimaryKey->MakeSQL() ;
			}
		}
	}

	/**
	 * 返回主键的字段对象
	 * 
	 * @access	public
	 * @return	JCAT_DBColumn, null
	 */
	public function GetPrimaryKey()
	{
		return $this->aPrimaryKey ;
	}
	
	
	/**
	 * 按照数据表 整理数据
	 *
	 * @access	public
	 * @param	$sTableName		string
	 * @return	array
	 */
	public function GetDatasByTableName($sTableName)
	{
		$arrData = $this->GetDatas(true) ;	
		$arrTableData = array() ; 
		
		foreach($arrData as $sName=>&$sValue)
		{
			if( preg_match("/^{$sTableName}\./i",$sName) )
			{
				$arrTableData[$sName] = &$sValue ;
			}
		}
		
		return $arrTableData ;
	}
	
	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @return	bool
	 */
	function Create()
	{
		// 主表表名
		$sTableName = $this->GetPrimaryTableName() ;
		JCAT_ASSERT::ASSERT_($sTableName,JCAT_Language::SentenceEx('创建新纪录操作，主数据表不能为空。','JCAT',null)) ;
		
		
		// 数据
		$arrPrimaryTableData = $this->GetDatasByTableName($sTableName) ; 

		// 数据库类
		$aDB = $this->GetDB() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aDB,'JCAT_DB') ;

		// 操作
		if( !$aDB->Insert($sTableName,$arrPrimaryTableData) )
		{
			return false ;
		}
		
		// 取得主键值
		if( $this->GetPrimaryKeyName() and $this->GetPrimaryKeyValue()===JCAT_Document::NULL_DATA_VALUE )
		{
			$nPrimaryKeyValue = $aDB->GetInsertID() ;
			$this->SetPrimaryKeyValue($nPrimaryKeyValue) ;
		}
		
		return true ;
	}


	/**
	 * What's this Method ?
	 * 
	 * @access	public
	 * @return	bool
	 */
	public function Load()
	{		
		// 创建记录集对象
		$aRecordSet = $this->QueryForRecordset() ;
		if($aRecordSet===null)
		{
			return false ;
		}
			
		// 从记录集中载入数据
		$this->LoadDataFromRecordSet($aRecordSet) ;
		
		$this->bExists = true ;
		
		return true ;
	}

	/**
	 * 查询并返回记录集
	 *
	 * @access	public
	 * @return	JCAT_DBRecordSet
	 */
	public function QueryForRecordset()
	{
		$aSelect = $this->MakeSQLSelect() ;		
		$aSelect->SetLimit(1) ;
		
		// 创建记录集对象
		$aRecordSet = $this->aDB->GetFactory()->CreateRecordSet($this->aDB->GetConnect()) ;
		JCAT_ASSERT::ASSERT_INSTANCE($aRecordSet,'JCAT_DBRecordSet') ;

		// 查询	
		if( $this->OnQuery($aSelect,$aRecordSet) )
		{
			return $aRecordSet ;
		}
		else
		{
			return null ;
		}
	}

	/**
	 * 执行实际的查询操作， 可以重載该方法，以便实现更高级的文档查询操作
	 * 
	 * @access	protected
	 * @param	$aSelect		JCAT_DBSQLSelect		what's this
	 * @param	$aRecordSet		JCAT_DBRecordSet		what's this
	 * @return	bool
	 */
	protected function OnQuery(JCAT_DBSQLSelect $aSelect,JCAT_DBRecordSet $aRecordSet)
	{
		$aRecordSet->Query($aSelect) ;
		return ($aRecordSet->GetCount()>0) ;
	}

	/**
	 * 从记录集中装载数据
	 * 
	 * @access	public
	 * @param	$aQueriedRecordSet	JCAT_DBRecordSet	一个已经查询过 的 记录集
	 * @return	bool
	 */
	public function LoadDataFromRecordSet( JCAT_DBRecordSet $aQueriedRecordSet )
	{
		if( $sMsg=JCAT_Language::SentenceEx('文档：“%s”载入失败，正在从一个空的记录集中载入数据。','JCAT',null,$this->GetName()) and $aQueriedRecordSet->GetCount()<1 )
		{
			throw new JCAT_Exception( $sMsg, __macro_exception_code__ ) ;
		}

		if( !$arrData = $aQueriedRecordSet->GetRow() )
		{
			return false ;
		}

		foreach( $arrData as $sName=>&$sData )
		{
			//if( $this->IsDataExists($sName) )
			//{
				$this->Set($sName,&$sData) ;
			//}
		}

		return true ;
	}

	/**
	 * 保存记录，如果 IsChanged() 返回false 且 $bIgnoreChanged＝false ,不会实际执行操作。
	 * 返回值仅代表 是否 实际执行操作，如果操作失败，抛出异常
	 * 
	 * @access	public
	 * @param	$bIgnoreChanged=false	bool	是否忽略 bChange
	 * @return	bool
	 */
	public function Save( $bIgnoreChanged=false )
	{
		if( !$bIgnoreChanged and !$this->IsChanged() )
		{
			return false ;
		}

		// 数据
		$arrData = $this->GetDatas(true) ;

		// 数据库类
		$aDB = $this->GetDB() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aDB,'JCAT_DB') ;

		// From 子句
		$aSubSQLFrom = $this->MakeSubSQLFrom() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aSubSQLFrom,'JCAT_DBSubSQLFrom') ;

		// Where 子句
		$sSubSQLWhere = $this->GetSubSQLWhere() ;
		JCAT_ASSERT::ASSERT_INSTANCE($sSubSQLWhere,'JCAT_DBSubSQLWhere') ;

		if( $aDB->Update($aSubSQLFrom,$arrData,$sSubSQLWhere) )
		{
			$this->bExists = true ;
			$this->SetChanged(false) ;
			
			return true ;		
		}
		
		else
		{
			return false ;
		}
	}
	
	
	/**
	 * 删除文档
	 * 
	 * @access	public
	 * @return	bool
	 */
	public function Delete()
	{
		if( $sMsg=JCAT_Language::SentenceEx('无法对一个空文档或尚未保存的文档 进行删除操作。','JCAT',null) and $this->GetPrimaryKeyValue()===null )
		{
			throw new JCAT_Exception( $sMsg, __macro_exception_code__ ) ;
		}

		$aSubSQLWhere = $this->GetSubSQLWhere() ;
		$aSubSQLFrom = $this->MakeSubSQLFrom() ;

		$aDB = $this->GetDB() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aDB,'JCAT_DB') ;

		if( $aDB->Delete($aSubSQLFrom,$aSubSQLWhere) )
		{
			$this->bExists = false ;
			return true ;
		}
		else
		{
			return false ;
		}
	}
	
	/**
	 * 设置 Order 子句
	 *
	 * @access	public
	 * @param	$aSubSQLOrder		JCAT_DBSubSQLOrder
	 * @return	old_value
	 */
	public function SetSubSQLOrder(JCAT_DBSubSQLOrder $aSubSQLOrder)
	{
		$old_value = $this->aSubSQLOrder ;
		$this->aSubSQLOrder = $aSubSQLOrder ;
		return $old_value ;
	}
	
	/**
	 * 以字符串格式 设置 Order 子句
	 *
	 * @access	public
	 * @param	$sSubSQLOrder		string
	 * @return	old_value
	 */
	public function SetStringSubSQLOrder($sSubSQLOrder)
	{
		$old_value = $this->sSubSQLOrder ;
		$this->sSubSQLOrder = $sSubSQLOrder ;
		return $old_value ;
	}

	/**
	 * 返回 Order 子句
	 *
	 * @access	public
	 * @return	JCAT_DBSubSQLOrder
	 */
	public function GetSubSQLOrder()
	{
		return $this->aSubSQLOrder ;
	}
	
	/**
	 * 返回 字符串格式Order 子句
	 *
	 * @access	public
	 * @return	string
	 */
	public function GetStringSubSQLOrder()
	{
		return $this->sSubSQLOrder ;
	}
	
	/**
	 * 设置 From 子句，这将取代 缺省的  TableJoin 对象
	 *
	 * @access	public
	 * @param	$aSubSQLFrom		JCAT_DBSubSQLFrom
	 * @return	old_value
	 */
	public function SetSubSQLFrom(JCAT_DBSubSQLFrom $aSubSQLFrom)
	{
		$old_value = $this->aSubSQLFrom ;
		$this->aSubSQLFrom = $aSubSQLFrom ;
		return $old_value ;
	}

	/**
	 * 取回 From 子句
	 *
	 * @access	public
	 * @return	JCAT_DBSubSQLFrom
	 */
	public function GetSubSQLFrom()
	{
		return $this->aSubSQLFrom ;
	}
	
	/**
	 * 
	 *
	 * @access	public
	 * @return	JCAT_DBSQLSelect
	 */
	public function MakeSQLSelect()
	{
		// 工厂对象
		$aFactory = $this->GetDB()->GetFactory() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aFactory,'JCAT_DBAbstractFactory') ;
		
		// 返回字段 子句
		$aSubSQLReturnColumnList = $this->GetSubSQLReturnColumnList() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aSubSQLReturnColumnList,'JCAT_DBSubSQLReturnColumnList') ;
		
		// From 子句
		$aSubSQLFrom = $this->MakeSubSQLFrom() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aSubSQLFrom,'JCAT_DBSubSQLFrom') ;
		
		// Where 子句
		$aSubSQLWhere = $this->GetSubSQLWhere() ;
		JCAT_ASSERT::ASSERT_INSTANCE($aSubSQLWhere,'JCAT_DBSubSQLWhere') ;
		
		// 创建并装配 Select 对象
		$aSQLSelect = $aFactory->CreateSQLSelect($aSubSQLFrom) ;
		$aSQLSelect->SetSubSQLReturnColumnList($aSubSQLReturnColumnList) ;
		$aSQLSelect->SetSubSQLWhere($aSubSQLWhere) ;
		
		// 设置 Order By 子句
		if( $aOrder = $this->GetSubSQLOrder() )
		{
			$aSQLSelect->SetSubSQLOrder($aOrder) ;
		}
		if( $sOrder = $this->GetStringSubSQLOrder() )
		{
			$aSQLSelect->SetSubSQLOrder($sOrder) ;
		}
		
		return $aSQLSelect ;	
	}
	
	
	/**
	 * 创建一个  From SQL子句
	 *
	 * @access	public
	 * @return	JCAT_DBSubSQLFrom
	 */
	public function MakeSubSQLFrom()
	{
		if( $this->aSubSQLFrom )
		{
			return $this->aSubSQLFrom ;
		}
		
		else
		{
			$aTableJoin = $this->GetTableJoin() ;
			JCAT_ASSERT::ASSERT_INSTANCE($aTableJoin,'JCAT_DBTableJoin') ;
			
			$aFactory = $this->GetDB()->GetFactory() ;
			JCAT_ASSERT::ASSERT_INSTANCE($aFactory,'JCAT_DBAbstractFactory') ;
			
			$aSubSQLFrom = $aFactory->CreateSubSQLFrom() ;
			$aSubSQLFrom->AddTable($aTableJoin) ;
		
			return $aSubSQLFrom ;
		}
	}
	
	

	/**
	 * 文档是否存在
	 * 
	 * @access	public
	 * @param	$bRequery=false		bool	对于高级文档（如数据库文档），查询 文档是否存在 会存在一定性能代价 ，该参数允许缓存查询结果
	 * @return	bool
	 */
	public function IsExists( $bRequery=false )
	{
		// 尚未读取或保存的 新文档
		if( $this->GetPrimaryKeyValue()===null )
		{
			return false ;
		}
		
		else 
		{
			// 重新查询
			if($bRequery)
			{
				// TODO ... ...
				// 
				return true ;
			}
			
			// 有主键值 即为存在
			else 
			{
				return true ;
			}
		}
	}

	
	/**
	 * 设置一项查询条件
	 *
	 * @access	public
	 * @param	$sClmName		字段名
	 * @param	$Value			值
	 * @return	void
	 */
	public function SetQueryCondition($sClmName,$Value,$sOperator='=',$RightB=null)
	{
		$aWhere = $this->GetSubSQLWhere() ;
		$aFactory = $aWhere->GetFactory() ;
		
		$aWhere->AddCondition( $aFactory->CreateColumn($sClmName), $Value, $sOperator, $RightB ) ;
	}
	
	
	// 属性 ///////////////////////////////////////////////////////////////////////////////

	/**
	 * 
	 * 
	 * @access	private
	 * @var		bool
	 */
	const TOTAL_COLUMNS = 7658 ;
	
	/**
	 * 主数据表名称
	 * 
	 * @access	private
	 * @var		string
	 */
	private $sPrimaryTableName ;
	
	/**
	 * What's this Attribute ?
	 * 
	 * @access	private
	 * @var		JCAT_DB
	 */
	private $aDB ;

	/**
	 * SQL 返回字段对象
	 * 
	 * @access	private
	 * @var		JCAT_DBSubSQLReturnColumnList
	 */
	private $aDBSubSQLReturnColumnList ;

	/**
	 * SQL 数据表对象
	 * 
	 * @access	private
	 * @var		JCAT_DBTableJoin
	 */
	private $aDBTableJoin ;

	/**
	 * SQL Where子句对象
	 * 
	 * @access	private
	 * @var		JCAT_DBSubSQLWhere
	 */
	private $aDBSubSQLWhere ;



	/**
	 * What's this Attribute ?
	 * 
	 * @access	private
	 * @var		JCAT_DBColumn
	 */
	private $aPrimaryKey ;
	
	/**
	 * 文档是否存在
	 * 
	 * @access	private
	 * @var		bool
	 */
	private $bExists = false ;
	
	/**
	 * Description
	 * 
	 * @access	private
	 * @var		JCAT_DBSubSQLOrder
	 */
	private $aSubSQLOrder = null ;
	
	/**
	 * Description
	 * 
	 * @access	private
	 * @var		string
	 */
	private $sSubSQLOrder = '' ;

	/**
	 * Description
	 * 
	 * @access	private
	 * @var		JCAT_DBSubSQLFrom
	 */
	private $aSubSQLFrom = '' ;
	
}
?>